home *** CD-ROM | disk | FTP | other *** search
- package java.beans;
-
- import com.sun.beans.ObjectHandler;
- import java.lang.ref.Reference;
- import java.lang.ref.SoftReference;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.ListIterator;
- import java.util.Map;
- import sun.reflect.misc.ConstructorUtil;
- import sun.reflect.misc.MethodUtil;
- import sun.reflect.misc.ReflectUtil;
-
- class ReflectionUtils {
- private static Reference methodCacheRef;
-
- public static Class typeToClass(Class var0) {
- return var0.isPrimitive() ? ObjectHandler.typeNameToClass(var0.getName()) : var0;
- }
-
- public static boolean isPrimitive(Class var0) {
- return primitiveTypeFor(var0) != null;
- }
-
- public static Class primitiveTypeFor(Class var0) {
- if (var0 == Boolean.class) {
- return Boolean.TYPE;
- } else if (var0 == Byte.class) {
- return Byte.TYPE;
- } else if (var0 == Character.class) {
- return Character.TYPE;
- } else if (var0 == Short.class) {
- return Short.TYPE;
- } else if (var0 == Integer.class) {
- return Integer.TYPE;
- } else if (var0 == Long.class) {
- return Long.TYPE;
- } else if (var0 == Float.class) {
- return Float.TYPE;
- } else if (var0 == Double.class) {
- return Double.TYPE;
- } else {
- return var0 == Void.class ? Void.TYPE : null;
- }
- }
-
- private static boolean matchArguments(Class[] var0, Class[] var1) {
- return matchArguments(var0, var1, false);
- }
-
- private static boolean matchExplicitArguments(Class[] var0, Class[] var1) {
- return matchArguments(var0, var1, true);
- }
-
- private static boolean matchArguments(Class[] var0, Class[] var1, boolean var2) {
- boolean var3 = var0.length == var1.length;
-
- for(int var4 = 0; var4 < var0.length && var3; ++var4) {
- Class var5 = var1[var4];
- if (var5.isPrimitive()) {
- var5 = typeToClass(var5);
- }
-
- if (var2) {
- if (var0[var4] != var5) {
- var3 = false;
- }
- } else if (var0[var4] != null && !var5.isAssignableFrom(var0[var4])) {
- var3 = false;
- }
- }
-
- return var3;
- }
-
- static Method getPublicMethod(Class var0, String var1, Class[] var2) throws NoSuchMethodException {
- Method var3 = findPublicMethod(var0, var1, var2);
- if (var3 == null) {
- throw new NoSuchMethodException(var0.getName() + "." + var1);
- } else {
- return var3;
- }
- }
-
- public static Method findPublicMethod(Class var0, String var1, Class[] var2) {
- if (var2.length == 0) {
- try {
- return MethodUtil.getMethod(var0, var1, var2);
- } catch (NoSuchMethodException var7) {
- return null;
- } catch (SecurityException var8) {
- }
- }
-
- Method[] var3 = MethodUtil.getPublicMethods(var0);
- ArrayList var4 = new ArrayList();
-
- for(int var5 = 0; var5 < var3.length; ++var5) {
- Method var6 = var3[var5];
- if (var6.getName().equals(var1) && matchArguments(var2, var6.getParameterTypes())) {
- var4.add(var6);
- }
- }
-
- if (var4.size() > 0) {
- if (var4.size() == 1) {
- return (Method)var4.get(0);
- } else {
- ListIterator var9 = var4.listIterator();
-
- while(var9.hasNext()) {
- Method var10 = (Method)var9.next();
- if (matchExplicitArguments(var2, var10.getParameterTypes())) {
- return var10;
- }
- }
-
- return getMostSpecificMethod(var4, var2);
- }
- } else {
- return null;
- }
- }
-
- private static Method getMostSpecificMethod(List var0, Class[] var1) {
- Method var2 = null;
- int var3 = 0;
- int var4 = var3;
- ListIterator var5 = var0.listIterator();
-
- while(var5.hasNext()) {
- Method var6 = (Method)var5.next();
- Class[] var7 = var6.getParameterTypes();
- var3 = 0;
-
- for(int var8 = 0; var8 < var1.length; ++var8) {
- Class var9 = var7[var8];
- if (var9.isPrimitive()) {
- var9 = typeToClass(var9);
- }
-
- if (var1[var8] == var9) {
- ++var3;
- }
- }
-
- if (var3 == 0 && var4 == 0) {
- if (var2 == null) {
- var2 = var6;
- } else if (!matchArguments(var2.getParameterTypes(), var6.getParameterTypes())) {
- var2 = var6;
- }
- } else if (var3 > var4) {
- var4 = var3;
- var2 = var6;
- } else if (var3 == var4) {
- var2 = null;
- }
- }
-
- return var2;
- }
-
- public static Method findMethod(Class var0, String var1, Class[] var2) {
- Method var3 = findPublicMethod(var0, var1, var2);
- if (var3 != null && Modifier.isPublic(var3.getDeclaringClass().getModifiers())) {
- return var3;
- } else {
- for(Class var4 = var0; var4 != null; var4 = var4.getSuperclass()) {
- Class[] var5 = var4.getInterfaces();
-
- for(int var6 = 0; var6 < var5.length; ++var6) {
- var3 = findPublicMethod(var5[var6], var1, var2);
- if (var3 != null) {
- return var3;
- }
- }
- }
-
- return null;
- }
- }
-
- public static synchronized Method getMethod(Class var0, String var1, Class[] var2) {
- Signature var3 = new Signature(var0, var1, var2);
- Object var4 = null;
- Object var5 = null;
- boolean var6 = false;
- if (ReflectUtil.isPackageAccessible(var0)) {
- var6 = true;
- }
-
- if (var6 && methodCacheRef != null && (var5 = (Map)methodCacheRef.get()) != null) {
- Method var7 = (Method)((Map)var5).get(var3);
- if (var7 != null) {
- return var7;
- }
- }
-
- Method var8 = findMethod(var0, var1, var2);
- if (var6 && var8 != null) {
- if (var5 == null) {
- var5 = new HashMap();
- methodCacheRef = new SoftReference(var5);
- }
-
- ((Map)var5).put(var3, var8);
- }
-
- return var8;
- }
-
- public static Constructor getConstructor(Class var0, Class[] var1) {
- Constructor var2 = null;
- Constructor[] var3 = ConstructorUtil.getConstructors(var0);
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (matchArguments(var1, var3[var4].getParameterTypes())) {
- var2 = var3[var4];
- }
- }
-
- return var2;
- }
-
- public static Object getPrivateField(Object var0, Class var1, String var2) {
- return getPrivateField(var0, var1, var2, (ExceptionListener)null);
- }
-
- public static Object getPrivateField(Object var0, Class var1, String var2, ExceptionListener var3) {
- try {
- Field var4 = var1.getDeclaredField(var2);
- var4.setAccessible(true);
- return var4.get(var0);
- } catch (Exception var5) {
- if (var3 != null) {
- var3.exceptionThrown(var5);
- }
-
- return null;
- }
- }
- }
-